/* 
 * UNIVERSIDAD DEL VALLE DE GUATEMALA 
 * ALGORITIMOS Y ESTRUCTURAS DE DATOS - SECCION 20
 * INTEGRANTES:     KEVIN GONZALEZ, 11499
 *                  SERGIO ARGUETA, 11029
 *                  PEDRO CASTILLO, 11009
 *                  JAVIER CASTILLO, 11010
 * DECRIPCION: CLASE FACTORY IMPLEMENTADA PARA EL PATRON DISEÑO FACTORY 
 */

// Importacion de bibliotecas
import java.util.Random;
// clase para utilizar patron de diseño factory.
public class Factory<E>
{
    // DECLARACION DE ATRIBUTOS
    int interfaz, type;
    StackVector<E> Vector;
    StackArray<E> Array;
    StackList<E> List;
    Random generate = new Random();
    // SE GENERAN LOS RANDOMS CORRESPONDIENTES.
    public Factory()
    {
        // RANDOM QUE SIRVE PARA DETERMINAR SI SE USARA INTERFAZ STACK O LISTINTERFACE.
        interfaz = generate.nextInt(1)+1;
        // RANDOM GENERADO PARA VER QUE TIPO DE METODO DE STACK O DE LISTA SE VA A ULTILIZAR
        type = generate.nextInt(2)+1;
    }
    // METODO PARA RETORNAR INTERFAZ GENERADO
    public int GetInterfaz()
    {
        return interfaz;
    }
    // METODO PARA EVALUAR QUE METODO DE STACK SE VA A USAR, VECTOR, ARRAY O ARRAYLIST
    public Stack<E> Evaluate()
    {
        if (type==1)//Vector
        {
            Vector = new StackVector();
            return Vector;
        }
        else
        {
            if (type==2)//Array
            {
                Array = new StackArray();
                return Array;
            }
            else
            {
                List = new StackList();
                return List;
            }
        }
                
    }
    // METODO PARA DETERMINAR QUE TIPO DE LISTA SE UTILIZARA, SIMPLE O DOBLEMENTE ENCADENADA.
    public ListInterface<E> EvaluateOther()
    {
        if(type==1)
        {
            return new SimpleLinkedList();
        }
        else
        {
            return new DoubleLinkedList();
        }
    }
}

    